/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package logica;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import log.ExpertoLog;
import org.apache.xml.serialize.OutputFormat;
import org.apache.xml.serialize.XMLSerializer;
import org.xml.sax.*;
import org.xml.sax.helpers.AttributesImpl;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.helpers.XMLReaderFactory;

public class ExpertoXml extends DefaultHandler {

    private final XMLReader xr;
    List<String> lista= new ArrayList<String>();
    String texto = new String();
    String textoAux="listablanca";
    private long cantMediciones=0;

    private static FileOutputStream fos;
    private static ContentHandler hd;

    public ExpertoXml() throws SAXException {
        xr = XMLReaderFactory.createXMLReader();
        xr.setContentHandler(this);
        xr.setErrorHandler(this);
        
    }

    public static void inicializardocumento(String nombre){
        try{
        fos = new FileOutputStream(nombre,true);


            OutputFormat of = new OutputFormat("XML", "ISO-8859-1",true);


            XMLSerializer serializer = new XMLSerializer(fos, of);

             hd = serializer.asContentHandler();
//             if(cantMediciones==0){
            hd.startDocument();
            
        }catch (IOException ex) {
            Logger.getLogger(ExpertoXml.class.getName()).log(Level.SEVERE, null, ex);
            ExpertoLog.logger.error("#Excpeción de IO inicializando el documento XML de lecturas de variables");
        } catch (SAXException ex) {
            Logger.getLogger(ExpertoXml.class.getName()).log(Level.SEVERE, null, ex);
            ExpertoLog.logger.error("#Excpeción SAX inicializando el documento XML de lecturas de variables");
        }
    }
    
    public void escribirMensajes(List<DtoMensaje> Msj){
       try{
            List<DtoVariables> varaux = new ArrayList<DtoVariables>();

//            FileOutputStream fos = new FileOutputStream("lecturas.xml",true);
//
//
//            OutputFormat of = new OutputFormat("XML", "ISO-8859-1", true);
//
//
//            XMLSerializer serializer = new XMLSerializer(fos, of);
//
//            ContentHandler hd = serializer.asContentHandler();
////             if(cantMediciones==0){
//            hd.startDocument();
//             }
            
            cantMediciones++;
            AttributesImpl atts = new AttributesImpl();
            atts.addAttribute("", "", "time", "CDATA" , new Date().toString());
    
            hd.startElement("", "", "medicion", atts);
            
            String aux2 = new String();

            atts.clear();
            for(DtoMensaje mensa : Msj){
           
               varaux = mensa.getVars();
               
               
               hd.startElement("", "", mensa.getEquipo(), atts);
               
               for (DtoVariables Dtovaraux : varaux){
               
                atts.clear();
                aux2 = Dtovaraux.getNombreVar();
                hd.startElement("", "", aux2, atts);
                hd.characters(Dtovaraux.getValor().toCharArray(), 0, Dtovaraux.getValor().length());
                hd.endElement("", "", aux2);
               
               }
               
               hd.endElement("", "", mensa.getEquipo());
                        
            }
            
            hd.endElement("", "", "medicion");
//            hd.endDocument();
//            fos.close();
        }catch (SAXException ex) {
            Logger.getLogger(ExpertoXml.class.getName()).log(Level.SEVERE, null, ex);
            ExpertoLog.logger.error("#Excepción tratando de escribir al archivo de mediciones XML",ex);
        }

    }

    public static void finalizarDocumento(){
        try {
            hd.endDocument();
            fos.close();
        } catch (SAXException ex) {
            Logger.getLogger(ExpertoXml.class.getName()).log(Level.SEVERE, null, ex);
            ExpertoLog.logger.error("#Excepción SAX tratando de finalizar el archivo de mediciones XML",ex);
        
        }catch (IOException ex) {
            Logger.getLogger(ExpertoXml.class.getName()).log(Level.SEVERE, null, ex);
            ExpertoLog.logger.error("#Excepción de IA tratando de finalizar el archivo de mediciones XML",ex);
        }
    }

    public List<String> leerlistablanca(final String archivoXML) throws FileNotFoundException, IOException, SAXException {

        FileReader fr = new FileReader(archivoXML);
        //SuscriptorLog.getInst().notificar("Mail validos:");
        xr.parse(new InputSource(fr));


        return lista;
    }

    @Override
    public void startElement(String uri, String name, String qName, Attributes atts) {
        textoAux = qName;
            //if(!qName.equals("listablanca"))SuscriptorLog.getInst().notificar("Nombre del equipo:"+qName);
    }

    @Override
    public void characters(char[] ch, int start, int lenght) {
        if (!textoAux.equals("listablanca")) {
            String Mail = new String(ch, start, lenght);
            if (!Mail.equals("\n")) {
                lista.add(Mail);
                //SuscriptorLog.getInst().notificar("Mail:"+Mail);
            }
        }
    }

            
}